#include <iostream>
#include <unistd.h>

//孤儿进程
//先说子进程退出的流程，
//流程1、子进程正常或异常退出，大部分资源释放，留下一个zombie的结构体，包含进程id等信息
//流程2、父进程调用wait或者waitpid，调用即释放该子进程的zombie结构体，此时子进程才完全退出
//孤儿进程产生的原因就是，子进程在运行时，父进程就GG了，导致子进程变成了孤儿进程
//但是孤儿进程的父pid会自动变为1(init进程的pid就是1),init进程会循环调用wait，子进程退出后也就会帮父进程执行流程2
//也就是说孤儿进程没啥危害

//本案例复现孤儿进程
//建议在终端运行，因为父进程退出后，编辑器不会继续打印子进程的信息
int main(){
    std::cout<< "process_orphan.cpp" << std::endl;

    pid_t childPid;
    childPid = fork();
    if(childPid < 0){
        std::cout<< "fork失败" << std::endl;
        exit(1);
    }else if(childPid == 0){
        //child
        printf("1im child, getpid()=%d, getppid()=%d\n", getpid(), getppid());//如果父进程先退出，此时的getppid就会等于1
        sleep(5);
        printf("2im child, getpid()=%d, getppid()=%d\n", getpid(), getppid());

        return 0;
    }else{
        printf("3im father, getpid()=%d\n", getpid());
    }

    return 0;
}